﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<assert.h>
#include<limits.h>
enum State
{
	VALID,//0
	INVALID//1
};
enum State state = INVALID;//默认非法

int my_atoi(char* p)
{
	assert(p);
	int flag = 1;//标记数字符号，默认为正
	
	//跳过空白字符
	while (isspace(*p))
	{
		p++;
	}
	if (*p == '+')
	{
		p++;//跳过正号
	}
	if (*p == '-')
	{
		flag = -1;
		p++;//跳过负号
	}
	//若跳过空格和符号后字符串只有\0, return结束
	if (*p == '\0')
	{
		return 0;
	}
	long long int tmp = 0;
	while (isdigit(*p))//判断是否为数字的字符,遇到\0会结束
	{
		tmp = tmp * 10 + flag*(*p - 48);
		if (tmp>INT_MAX)//当tmp不在int储存范围内
			return INT_MAX;
		if( tmp < INT_MIN)
			return INT_MIN;
		p++;
	}
	if (*p == '\0')//正常结束
	{
		state = VALID;
		return (int)tmp;
	}
	else   //非正常结束
		return (int)tmp;//强制类型转换
}
int main()
{
	//实现atoi
	char* p = "-124345";
	int a=my_atoi(p);
	if (state==INVALID)
	{
		printf("非法输入");
	}
	else
	printf("该字符串转换后为：%d", a);
	return 0;
}